﻿using PhraseCorrector.Common;
using PhraseCorrector.DirectTanslate;
using PhraseCorrector.SimplePinyin;
using PhraseCorrector.SpellLook;
using System;
using System.Collections.Generic;
using System.Linq;

namespace PhraseCorrector.SpellCorrect {
    
    /**
     * 拼写校正类，用于处理英文拼写错误。
     */
    internal class EnglishSpell
    {

        #region 静态变量

        // //////////////////////////////////////////////////////////////////////////     
        /// <summary>
        /// 最大编辑距离，用于衡量字符串相似度
        /// 调入字库时使用。之后可在纠错时，动态调整该值
        /// </summary>
        /// <remarks>
        /// 默认为3, 如果为0，则表示完全匹配
        /// 1. 匹配度越低，越可能为假词
        /// 2. 匹配度越高，越可能为正确词
        /// 默认值是3，比较敏感，英文术语相对较长，故英文纠错使用该值，以保障短词汇5毫秒内完成。
        /// </remarks>
        private static int MaxEditDistance { set; get; } = 1;

        // //////////////////////////////////////////////////////////////////////////       
        /// <summary>
        /// 拼写校正库文件前缀长度，用于加速查询
        /// </summary>
        private static int PrefixLength { set; get; }= 7;

        // //////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 拼写处理属性，用于设置和获取拼写校正的复合对象。
        /// </summary>
        public static Spell _SpellHandle= null;

        // //////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 获取SpellCompound的实例，用于处理拼写错误。
        /// </summary>
        /// <returns>SpellCompound的实例。</returns>
        /// <exception cref="Exception">如果实例化失败，则抛出异常。</exception>
        public static Spell SpellHandle
        {
            get
            {
                // 懒加载SpellHandle实例，如果未初始化，则进行初始化。
                // 返回SpellHandle实例
                _SpellHandle ??= CreateSpellHandle();
                // 检查SpellHandle实例是否成功创建，如果未创建，则抛出异常。
                return _SpellHandle != null
                    ? _SpellHandle
                    : throw new Exception("字库转载失败.");
            }
        }

        // //////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 创建SpellHandle实例。
        /// </summary>
        /// <returns>返回一个新的SpellCompound实例，如果创建失败则返回null。</returns>
        private static Spell CreateSpellHandle()
        {
            // 使用指定的字库路径、初始容量、最大编辑距离和前缀长度来创建SpellCompound实例。
            return new Loadlibrary(BasePath.EnglishLibPath, MaxEditDistance, PrefixLength, PhraseType.English).SpellHandle;
        }
        #endregion

        #region 构造函数
        
        // //////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 默认构造函数，用于初始化拼写校正库。
        /// </summary>
        public EnglishSpell()
        {
            // 懒加载SpellHandle实例，如果未初始化，则进行初始化。
            _SpellHandle ??= CreateSpellHandle();
            if (_SpellHandle.WordCount== 0)
                Logger.Log.Error($"中文频率字典{BasePath.EnglishLibPath}调入失败.");
        }
        #endregion

    }
}
